package org.rabbitmq.mq02.mqServer.core;

import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * 创建消息
 * 后面传递消息时,需要将消息进行序列化,此处要实现Serializable接口才可以被序列化
 */
@Data
public class Message implements Serializable {
    //消息中的真正数据
    private byte[] body;
    //消息本身的一些属性:
    private BasicProperties basicProperties = new BasicProperties();
    //消息在文件中的起始位置,[offsetBeg,offsetEnd]
    //由于消息要持久化存储,因此要存储在磁盘中,为了区分每一条消息,记录每条消息的起始位置
    //使用transient修改,避免被序列化
    private transient long offsetBeg = 0;
    private transient long offsetEnd = 0;
    //消息在磁盘中是否有效,该属性用于删除磁盘消息使用,使用逻辑删除
    //0x1:有效 0x0:无效
    private byte isVaild = 0x1;

    //创建消息 同时给消息分配一个id,通过UUID,创建唯一ID,消息Id以"M-"开头
    //routingKey:以参数为准,当原来的消息存在routingKey时,参数会将其覆盖
    //此处相当于使用了工厂方法创建消息对象,而没有使用构造方法,因为这样可以通过方法名获取到相关信息
    public Message createMessageById(String routingKey,BasicProperties basicProperties,byte[] body){
        Message message = new Message();
        message.setMessageId("M-"+ UUID.randomUUID());
        message.setRoutingKey(routingKey);
        if(basicProperties!=null){
            message.setBasicProperties(basicProperties);
        }
        message.setBody(body);
        return message;
    }

    //为了方便引用,将BasicProperties中的属性在这里调用一下,方便直接通过Message调用其基本属性
    public String getMessageId(){
        return basicProperties.getMessageId();
    }

    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }
    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

    public int getDeliveryMode(){
        return basicProperties.getDeliveryMode();
    }
    public void setDeliveryMode(int deliveryMode){
        basicProperties.setDeliveryMode(deliveryMode);
    }
}
